home *** CD-ROM | disk | FTP | other *** search
/ Precision Software Appli…tions Silver Collection 1 / Precision Software Applications Silver Collection Volume One (PSM) (1993).iso / demos / devel3.exe / STEREOV.C < prev    next >
C/C++ Source or Header  |  1992-05-17  |  4KB  |  137 lines

  1. /* Stereo viewing support */
  2.  
  3. /* Written by Dave Stampe; part of the REND386 package */
  4.  
  5. /* Copyright 1992 by Dave Stampe and Bernie Roehl.
  6.    May be freely used to write software for release into the public domain;
  7.    all commercial endeavours MUST contact Bernie Roehl and Dave Stampe
  8.    for permission to incorporate any part of this software into their
  9.    products!
  10.  */
  11.  
  12. #include <conio.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <ctype.h>   /* toupper() */
  16. #include <dos.h>
  17.  
  18. #include "rend386.h"
  19. #include "userint.h"
  20.  
  21. /* default screen data setup: example only */
  22.  
  23. /* STEREO default_stereo = { 1000, 250, 320, 63, 1000, 10*65536L }; */
  24.  
  25. /* static VIEW default_view = {
  26. /*            0,0,-1000,         /* ex,ey,ez */
  27. /*            0,0,0,             /* pan,tilt,roll */
  28. /*            9*65536L,          /* zoom */
  29. /*            1000,15000,-5000,  /* lx,ly,lz */
  30. /*            0,319,0,200,       /* left,right,top,bottom */
  31. /*            1,100000,          /* hither, yon */
  32. /*            1/1.25*65536L,     /* aspect ratio */
  33. /*            0,                 /* flags */
  34. /*            0,0                   /* no offset */
  35. /*            };                 /* don't init. matrix */
  36.  
  37.  
  38.  
  39. void make_stereo_view(VIEW *root, VIEW *nview, STEREO *stereo, int eye)
  40.     {
  41.     long x_fixup;
  42.     long world_iod;
  43.     MATRIX icam;
  44.  
  45.     *nview = *root;  /* copy root view */
  46.     nview->zoom = (65536L * 2L * stereo->phys_screen_dist) /
  47.             stereo->phys_screen_width;
  48.  
  49.     /* screen offset */
  50.     x_fixup = (stereo->phys_eye_spacing *
  51.         stereo->phys_screen_dist * stereo->pixel_width )
  52.         / (stereo->phys_convergence * 2 * stereo->phys_screen_width);
  53.  
  54.     /* eye point */
  55.     world_iod = (stereo->phys_eye_spacing * stereo->world_scaling) >> 17;
  56.  
  57.     /* make left/right */
  58.     if (eye == LEFT_EYE)
  59.         {
  60.         nview->x_offset -= x_fixup ;
  61.         nview->eye_xform[3][0] -= m_mult(world_iod,nview->eye_xform[0][0]);
  62.         nview->eye_xform[3][1] -= m_mult(world_iod,nview->eye_xform[0][1]);
  63.         nview->eye_xform[3][2] -= m_mult(world_iod,nview->eye_xform[0][2]);
  64.         }
  65.     else if (eye == RIGHT_EYE)
  66.         {
  67.         nview->x_offset += x_fixup ;
  68.         nview->eye_xform[3][0] += m_mult(world_iod,nview->eye_xform[0][0]);
  69.         nview->eye_xform[3][1] += m_mult(world_iod,nview->eye_xform[0][1]);
  70.         nview->eye_xform[3][2] += m_mult(world_iod,nview->eye_xform[0][2]);
  71.         }
  72.     initialize_screen_factors(nview);
  73.     }
  74.  
  75.  
  76.  
  77.         /* sufficient if only view point has changed */
  78. void update_stereo_view(VIEW *v, STEREO *s, int eye)
  79.     {
  80.     long world_iod = (s->phys_eye_spacing * s->world_scaling)>>17;
  81.  
  82.     if (eye == LEFT_EYE)
  83.         {
  84.         v->eye_xform[3][0] -= m_mult(world_iod,v->eye_xform[0][0]);
  85.         v->eye_xform[3][1] -= m_mult(world_iod,v->eye_xform[1][0]);
  86.         v->eye_xform[3][2] -= m_mult(world_iod,v->eye_xform[2][0]);
  87.         }
  88.     else if (eye == RIGHT_EYE)
  89.         {
  90.         v->eye_xform[3][0] += m_mult(world_iod,v->eye_xform[0][0]);
  91.         v->eye_xform[3][1] += m_mult(world_iod,v->eye_xform[1][0]);
  92.         v->eye_xform[3][2] += m_mult(world_iod,v->eye_xform[2][0]);
  93.         }
  94.     }
  95.  
  96.  
  97. void mirr_stereo_view(VIEW *root, VIEW *nview, STEREO *stereo, int eye)
  98.     {
  99.     long x_fixup;
  100.     long world_iod;
  101.     MATRIX icam;
  102.     int i;
  103.  
  104.     *nview = *root;                        /* copy root view */
  105.     nview->zoom = (65536L * 2L * stereo->phys_screen_dist) /
  106.         stereo->phys_screen_width;
  107.  
  108.     /* screen offset */
  109.     x_fixup = (stereo->phys_eye_spacing * stereo->phys_screen_dist
  110.         * stereo->pixel_width ) /
  111.     (stereo->phys_convergence * 2 *    stereo->phys_screen_width);
  112.  
  113.     /* eye point */
  114.     world_iod = (stereo->phys_eye_spacing * stereo->world_scaling) >> 17;
  115.  
  116.     /* make left/right */
  117.     if (eye == LEFT_EYE)
  118.         {
  119.         nview->x_offset -= x_fixup;
  120.         nview->eye_xform[3][0] -= m_mult(world_iod,nview->eye_xform[0][0]);
  121.         nview->eye_xform[3][1] -= m_mult(world_iod,nview->eye_xform[0][1]);
  122.         nview->eye_xform[3][2] -= m_mult(world_iod,nview->eye_xform[0][2]);
  123.         }
  124.      else if (eye == RIGHT_EYE)
  125.         {
  126.         nview->x_offset -= x_fixup ;
  127.         nview->eye_xform[3][0] += m_mult(world_iod,nview->eye_xform[0][0]);
  128.         nview->eye_xform[3][1] += m_mult(world_iod,nview->eye_xform[0][1]);
  129.         nview->eye_xform[3][2] += m_mult(world_iod,nview->eye_xform[0][2]);
  130.         nview->orientation = XFLIP;
  131.         nview->left = nview->right;
  132.         nview->right += nview->right;
  133.         }
  134.     initialize_screen_factors(nview);
  135.     }
  136.  
  137.